package it.csi.finregio.finreges.client.services;

import it.crp.crparch.web.struts.service.CRPStrutsService;
import it.crp.crparch.web.struts.service.WebServiceException;
import it.crp.crparch.web.tags.Page;
import it.crp.logger.PrdLoggerFactory;
import it.csi.csi.wrapper.CSIException;
import it.csi.finregio.finreges.presentation.Browser;
import it.csi.finregio.finreges.presentation.SessionObjects;
import it.csi.finregio.finreges.presentation.form.SchedaForm;
import it.csi.finregio.finreric.client.SearchParamConstants;
import it.csi.finregio.finreric.client.ServiceLocator;
import it.csi.finregio.finreric.dto.RecordRequest;
import it.csi.finregio.finreric.interfacecsi.SearchSchedaCSIService;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;

public class SearchService implements CRPStrutsService {

	private ResourceBundle bundle = ResourceBundle.getBundle("finreges");
	private Logger log=PrdLoggerFactory.getInstance().getLogger("finreges");
	public Object execute(ActionForm form) throws WebServiceException {
		try {
			SchedaForm sf = ((SchedaForm)form);
			HttpServletRequest request = sf.getRequest();
			RecordRequest rr = (RecordRequest) request.getSession(false).getAttribute(RecordRequest.class.getName());
			Map params = new HashMap();
			if(sf.getAnno()!=null && !sf.getAnno().equals("-1")){
				params.put(SearchParamConstants.ANNO, sf.getAnno());
			}
			if(sf.getNumeroQuaderno()!=null && !sf.getNumeroQuaderno().trim().equals("")){
				params.put(SearchParamConstants.NUMERO_QUADERNO, sf.getNumeroQuaderno());
			}
			if(sf.getProgressivo()!=null && !sf.getProgressivo().trim().equals("")){
				params.put(SearchParamConstants.NUMERO_SCHEDA, sf.getProgressivo());
			}
			if(sf.getTitolo()!=null && !sf.getTitolo().trim().equals("")){
				params.put(SearchParamConstants.TITOLO, sf.getTitolo());
			}
			if(sf.getClassificazione()!=null && !sf.getClassificazione().equals("-1")){
				params.put(SearchParamConstants.CLASSIFICAZIONE, sf.getClassificazione());
			}
			if(sf.getSottoClassificazione()!=null && !sf.getSottoClassificazione().equals("-1")){
				params.put(SearchParamConstants.SOTTOCLASSIFICAZIONE, sf.getSottoClassificazione());
			}
			if(sf.getDestinatari()!=null && !sf.getDestinatari().trim().equals("")){
				params.put(SearchParamConstants.DESTINATARI, sf.getDestinatari());
			}		
			if(sf.getProcedura()!=null && !sf.getProcedura().trim().equals("")){
				params.put(SearchParamConstants.PROCEDURA, sf.getProcedura());
			}		
			if(sf.getFinanziamenti()!=null && !sf.getFinanziamenti().trim().equals("")){
				params.put(SearchParamConstants.FINANZIAMENTI, sf.getFinanziamenti());
			}		
			if(sf.getIdEnte()!=null && !sf.getIdEnte().equals("-1")){
				params.put(SearchParamConstants.ASSESSORATO, sf.getIdEnte());
			}
			if(sf.getProgressivoDirezione()!=null && !sf.getProgressivoDirezione().equals("-1")){
				params.put(SearchParamConstants.DIREZIONE, sf.getProgressivoDirezione());
			}
//		if(sf.getClassificazione()!=null && !sf.getClassificazione().equals("-1")){
//			params.put(SearchParamConstants.CLASSIFICAZIONE, sf.getClassificazione());
//		}
			if(sf.getStatoScheda()!=null && !sf.getStatoScheda().equals("-1")){
				params.put(SearchParamConstants.STATO_SCHEDA, sf.getStatoScheda());
			}
			if(sf.getSchedaScaduta()!=null && !sf.getSchedaScaduta().equals("false")){
				params.put(SearchParamConstants.SCHEDA_SCADUTA, sf.getSchedaScaduta());
			}
//			if(sf.getDallaSchedaN()!=null && !sf.getDallaSchedaN().trim().equals("")){
//				params.put(SearchParamConstants.DALLA_SCHEDA_N,sf.getDallaSchedaN());
//			}
//			if(sf.getAllaSchedaN()!=null && !sf.getAllaSchedaN().trim().equals("")){
//				params.put(SearchParamConstants.ALLA_SCHEDA_N,sf.getAllaSchedaN());
//			}
			
			SearchSchedaCSIService csi = ServiceLocator.getInstance();
			rr.setQueryParams(params);
			String record4page=bundle.getString("rownum.pagina");
			String page = request.getParameter("page");
			rr.setLength(Integer.parseInt(record4page));
			if(page==null){
				rr = csi.countSchedeByParam(rr);
				int totalRows = rr.getRows();
				Browser browser = new Browser();
				browser.setRecordRequest(rr);
				browser.preparePagination();
				browser.setMaxPageVisible(10);

				request.getSession(false).setAttribute(SessionObjects.BOOK, browser);
				page="1";
			}
			Browser currentBook = (Browser) request.getSession(false).getAttribute(SessionObjects.BOOK);
			if(currentBook.getTotPages()==0){
				return new ArrayList();
			}
			Page currentPage = currentBook.getPage(Integer.parseInt(page));
			rr.setStartRow(currentPage.getFrom());
			Collection result = csi.findRangeSchedeByParam(rr);
			
			request.getSession(false).setAttribute(RecordRequest.class.getName(),rr);
			if(result.size()==0){
				return null;
			}
			return result;
		} catch (NumberFormatException e) {
			log.error("[SearchService::execute]  " + e.getMessage(),
					e);
			throw new WebServiceException(e.getMessage());
		} catch (MissingResourceException e) {
			log.error("[SearchService::execute]  " + e.getMessage(),
					e);
			throw new WebServiceException(e.getMessage());
		} catch (CSIException e) {
			log.error("[SearchService::execute]  " + e.getMessage(),
					e);
			throw new WebServiceException(e.getMessage());
		}
	}

}
